package com.ffggffgfv.backend.service.impl;

import com.ffggffgfv.backend.dto.PageResult;
import com.ffggffgfv.backend.dto.ProductQueryDTO;
import com.ffggffgfv.backend.entity.Product;
import com.ffggffgfv.backend.mapper.ProductMapper;
import com.ffggffgfv.backend.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 商品服务实现类
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    /**
     * 查询所有商品
     *
     * @return 商品列表
     */
    @Override
    public List<Product> findAll() {
        return productMapper.selectAll();
    }

    /**
     * 分页查询商品
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    @Override
    public PageResult<Product> findByPage(ProductQueryDTO queryDTO) {
        // 默认每页10条记录，页码从1开始
        Integer pageNum = queryDTO.getPageNum();
        Integer pageSize = queryDTO.getPageSize();

        // 计算偏移量
        int offset = (pageNum - 1) * pageSize;

        // 查询总数
        long total = productMapper.countByCondition(queryDTO);

        // 查询当前页数据
        List<Product> products = productMapper.selectByCondition(queryDTO, offset, pageSize);

        // 返回分页结果
        return new PageResult<>(products, total, pageNum, pageSize);
    }

    /**
     * 根据关键字搜索商品
     *
     * @param keyword 关键字
     * @param limit   返回最大数量
     * @return 匹配的商品列表
     */
    @Override
    public List<Product> searchByKeyword(String keyword, int limit) {
        // 只搜索上架的商品
        Integer status = 1;

        // 调用Mapper进行搜索
        return productMapper.searchProducts(keyword, status, limit);
    }

    /**
     * 根据ID查询商品
     *
     * @param id 商品ID
     * @return 商品对象
     */
    @Override
    public Product findById(Long id) {
        return productMapper.selectById(id);
    }

    /**
     * 创建商品
     *
     * @param product 商品对象
     * @return 创建的商品对象
     */
    @Override
    public Product create(Product product) {
        // 设置创建和更新时间
        Date now = new Date();
        product.setCreateTime(now);
        product.setUpdateTime(now);

        // 如果未设置状态，默认为上架状态
        if (product.getStatus() == null) {
            product.setStatus(1);
        }

        // 插入商品
        productMapper.insert(product);

        return product;
    }

    /**
     * 更新商品
     *
     * @param id      商品ID
     * @param product 商品对象
     * @return 更新后的商品对象
     */
    @Override
    public Product update(Long id, Product product) {
        // 查询原商品是否存在
        Product existingProduct = productMapper.selectById(id);
        if (existingProduct == null) {
            return null;
        }

        // 设置ID和更新时间
        product.setId(id);
        product.setUpdateTime(new Date());

        // 保留创建时间
        product.setCreateTime(existingProduct.getCreateTime());

        // 更新商品
        productMapper.update(product);

        return product;
    }

    /**
     * 删除商品
     *
     * @param id 商品ID
     * @return 是否成功
     */
    @Override
    public boolean delete(Long id) {
        int result = productMapper.deleteById(id);
        return result > 0;
    }

    /**
     * 更新商品状态
     *
     * @param id     商品ID
     * @param status 状态（0-下架 1-上架）
     * @return 更新后的商品对象
     */
    @Override
    public Product updateStatus(Long id, Integer status) {
        // 查询原商品是否存在
        Product existingProduct = productMapper.selectById(id);
        if (existingProduct == null) {
            return null;
        }

        // 更新状态和更新时间
        existingProduct.setStatus(status);
        existingProduct.setUpdateTime(new Date());

        // 更新商品
        productMapper.updateStatus(id, status, new Date());

        return existingProduct;
    }

    /**
     * 根据分类ID查询商品
     *
     * @param categoryId 分类ID
     * @param pageNum    页码
     * @param pageSize   每页大小
     * @return 分页结果
     */
    @Override
    public PageResult<Product> findByCategoryId(Long categoryId, int pageNum, int pageSize) {
        // 通过ProductQueryDTO封装查询条件
        ProductQueryDTO queryDTO = new ProductQueryDTO();
        queryDTO.setCategoryId(categoryId);
        queryDTO.setStatus(1); // 默认只查询上架商品
        queryDTO.setPageNum(pageNum);
        queryDTO.setPageSize(pageSize);

        return findByPage(queryDTO);
    }
}
